סריקה לרוחב פרק 3 ב- Kleinberg/Tardos
קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות.
קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות.
קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות. s
קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות. s t
קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות. s t
קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות. s t
רעיון ראשון לאלגוריתם ונתקדם באופן חמדני. נתחיל מ- s s t 3
רעיון ראשון לאלגוריתם ונתקדם באופן חמדני. נתחיל מ- s s t 3
רעיון שני לאלגוריתם וננסה את כל האפשרויות להתקדם. נתחיל מ- s אם דרגת היציאה של כל צומת, יש exp(n) אפשרויות להתקדם n צעדים. s t 4
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית s t 5
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית 0s t 5
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית 0s t 5
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית 0s t 5
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית 0s 3 3 t 5
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית 0s 3 3 t 4 5
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית 0s 3 3 5t 4 5
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית 6 0s 3 3 5t 4 5
סריקה לרוחב - מעבר חסכוני על האפשרויות ל- n צמתים לכל היותר. לצורך בכל צעד אפשר להגיע ההמשך לא חשוב איך הגענו לצומת מסויים. n צעדים. חזית של צמתים שאפשר להגיע אליהם אחרי נשמור בצעד הבא החזית תעבור לשכנים החדשים של החזית הנוכחית 6 0s 3 3 5t 4 5
BFS(G,s,t) for each x V {s} do visited[x] no end for frontier (s) while frontier do x first in frontier for each y Adj(x) do if visited[y] = no then visited[y] yes add y to frontier end if end for remove x from frontier end while return visited[t] = yes סריקה לרוחב (BFS) מציין אם הגענו כבר ל- x מחזיק את החזית לפי סדר ההגעה בצעד הזה נאמר שהקשת (x,y) נסרקה מוסיפים את y בסוף הרשימה 6
סיבוכיות המשתנה frontier ימומש על ידי תור. כל פעולה (שליפת ראש.O() התור, הכנסה, הוצאה) עולה אתחול: O( V ) ב- x : צומת x מוכנס לתור לכל היותר פעם אחת. זמן הטיפול O() הכנסה לתור: הוצאה מהתור: ()O מעבר על השכנים: O( Adj[x] ) סה כ: O( V + E ) O( V ) + x V {O() + O( Adj[x] )} = 7
מציאת מסלול while frontier do x first in frontier for each y Adj(x) do if visited[y] = no then from[y] x visited[y] yes add y to frontier end if end for remove x from frontier end while באתחול, לכל x V from[x] nil 8
חישוב מספר הצעדים while frontier do x first in frontier for each y Adj(x) do if visited[y] = no then from[y] x level[y] level[x] + visited[y] yes add y to frontier end if end for remove x from frontier end while באתחול: level[s] 0 x V {s}, level[x] 9
הוכחת נכונות את המספר המינימלי של קשתות במסלול מ- s ל- נסמן ב-( d(s,x x (או אם אין מסלול כזה). מסלול מ- s ל- x באורך d(s,x) נקרא קצר ביותר. מסלול משפט: בתום ריצת BFS(G,s,t) לכל.level[x] = d(s,x),x V אם <,d(s,x) אזי יש מסלול קצר ביותר מ- s ל- x שמורכב ממסלול קצר ביותר מ- s ל-[ from[x בתוספת הקשת.(from[x],x) from[x] s x t 0
הוכחת נכונות (המשך) הוכחה נוכיח את המשפט באינדוקציה על.d(s,x) בנוסף לנטען במשפט, נניח באינדוקציה שלכל y V עם d(s,x) d(s,y) > מתקיים ש- y נכנס ל- frontier אחרי x. בסיס האינדוקציה: = 0,d(s,x) כלומר x. = s הטענה נכונה על פי האתחול. נניח נכונות לכל x עבורו.d(s,x) < k יהי y V עבורו.d(s,y) = k נסמן (x,y) E} F(y) = {x V: d(s,x)=k- ו- (x,y) E}.B(y) = {x V: d(s,x) > k-
הוכחת נכונות (המשך) על פי הנחת האינדוקציה, כל איברי F(y) נכנסים (ולכן גם יוצאים) ל- או כל איבר ב-( B(y. y לפני frontier יהי x האיבר הראשון של F(y) שיוצא מ- frontier. כאשר סורקים את (x,y) עדיין no.visited[y] = בשלב זה מעדכנים את from[y] ו-[ level[y כנדרש, ו- y נכנס ל- frontier. אם z V מקיים d(s,y),d(s,z) > אזי z נכנס ל- frontier רק כאשר האיבר הראשון מ-( F(z יוצא מ- frontier, אבל לכל צומת F(z) z מתקיים -k,d(s,z ) > לכן לפי הנחת האינדוקציה, כל איברי F(z) נכנסים ל- frontier אחרי x. שימו לב שאם =,d(s,x) אזי כלל. לא נכנס ל- frontier x לכן,F(x) =
מסקנות נגדיר גרף מכוון (V,E ) G = על ידי: V = {x V: level[x] < } E = {(from[x],x): x V {s}} זהו עץ מכוון שמושרש ב- s. הצמתים ב- V הם בדיוק הצמתים הנגישים מ- s. לכל צומת כזה x, המסלול מ- s ל- x ב- G הוא מסלול קצר ביותר מ- s ל- x ב- G. 3
הדגמה 3 4 0 3 4 4 4
הערות אפשר להריץ את האלגוריתם על גרף לא מכוון. ל- x. ומ- y ל- y תיסרק בשני כיוונים: מ- x {x,y} כל קשת רק הסריקה הראשונה יכולה לגלות צומת חדש. כל הקשתות מחברות צמתים בשכבות סמוכות (ערכי level level זהים). שונים ב- ), או צמתים באותה השכבה (ערכי יש שימושים רבים לסריקה לרוחב: זיהוי רכיבים קשירים, חישוב מרחק בין צמתים, בדיקה אם גרף הוא דו-צדדי,... 5